/** ***********************************************************************************
* @file         os_app.h
* @brief        系统OS接口
* @details      封装OPENCPU 系统使用的接口
* @author       杨小珛
* @date         2020/12/23
* @copyright    北京高知科技有限公司
* @version      V1.0
* @attention    
**************************************************************************************/

#ifndef OS_APP_H
#define OS_APP_H
/* Standard includes. */
#include "fibo_opencpu.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

/** ****************************************************************************
* 系统全局功能宏定义
*******************************************************************************/
#define   OS_LOG_DEBUG_ENABLED      ( 1 )                           /*调试日志使能 1-打开 0-关闭*/ 


#define   OS_HARDWARE_MODEL     "GZ801B34GLGT00"                    /*系统硬件型号*/

#define   OS_GNSS_MODULE_MODEL      ( 1 )                           /*GNSS模块选择 1-常规模块 0-千寻模块*/
#define   OS_GNSS_MODULE_TYPE       ( 0 )                           /*GNSS模块选择类型，只针对常规模块。0-泰斗，波特率9600。1-中科微，波特率115200*/

/*目前支持三种加速度传感器，只能使能一个型号传感器********************************/
#define   OS_GSEN_BMI160_ENABLED    ( 0 )                           /*BMI160 6轴传感器使能 1-打开 0-关闭*/
#define   OS_GSEN_LIS3DH_ENABLED    ( 1 )                           /*LIS3DH 3轴传感器使能 1-打开 0-关闭*/
#define   OS_GSEN_LIS2DW_ENABLED    ( 0 )                           /*LIS2DW 3轴传感器使能 1-打开 0-关闭*/

#define   OS_MCU_CONFIG_ENABLED     ( 0 )                           /*MCU配置表功能使能 1-打开 0-关闭*/





/*******项目功能选择 */
#define     OS_PROJECT_VERSION_HRHC         (0x00)
#define     OS_PROJECT_VERSION_SHENZHOU     (0x01)
#define     OS_PROJECT_VERSION_WARMCAR      (0x05)
#define     OS_PROJECT_VERSION_CHITONG      (0x06)
#define     OS_PROJECT_VERSION_HELLO        (0x08)  

#define     OS_PROJECT_DEMAND_VERSION    OS_PROJECT_VERSION_SHENZHOU  

/*
    标准功能
        主辅平台鉴权
        设置VIN
        AGNSS
        LBS
        车辆数据存储（防止清0）
        ACC开10min未熄火，上传报警位（下发远程熄火 yjoff）
        发动机启动：30min 未动 ，上传报警位

    哈啰分时加密 哈啰独有功能
        0504存储历史数据功能，哈啰不需要,哈啰需要实时长传的数据，历史数据不做处理

    驰通需求：
        锁车判定ACC、车门、车灯、手刹，不符合条件不锁车并闪灯鸣笛
 
 */
 
/************定义电源检测水平************************************************/
#define	SYS_POWER_UP_VALUE			( 11000 )
#define	SYS_POWER_DOWN_VALUE		( 5000 ) 
 
#if  (OS_PROJECT_DEMAND_VERSION == OS_PROJECT_VERSION_SHENZHOU)
      
    #if (OS_GNSS_MODULE_TYPE == 0)/* 泰斗 */
        #define     OS_SOFTWARE_VERSION   "01.006.0049.250805.1482.72.01"   /*系统软件版本号*/ 
    #endif 
    #if (OS_GNSS_MODULE_TYPE == 1)/* 中科微 */ 
        #define     OS_SOFTWARE_VERSION   "01.006.0036.250624.1432.72.01"   /*系统软件版本号*/ 
    #endif
    
    #define     OS_FUNCTION_LOCK_CHECK_FUNCTION     ( 0 )               /*锁车检查车辆状态 ENABLE-打开，DISABLE-关闭*/
    #define     OS_LOCK_FAIL_FIND_FUNCTION          ( 0 )               /*锁车失败 鸣笛闪灯 */  
    #define     OS_HISTORY_VEHICLE_INFO_REPORT      ( 1 )               /*0504历史信息上报 ENABLE-打开，DISABLE-关闭 关闭时只上报实时的车辆信息*/

#elif (OS_PROJECT_DEMAND_VERSION == OS_PROJECT_VERSION_WARMCAR)
 
    #define     OS_SOFTWARE_VERSION   "01.006.0033.250207.1432.72.05"   /*系统软件版本号*/ 
    #define     OS_FUNCTION_LOCK_CHECK_FUNCTION     ( 1 )               /*锁车检查车辆状态 ENABLE-打开，DISABLE-关闭*/
    #define     OS_LOCK_FAIL_FIND_FUNCTION          ( 0 )               /*锁车失败 鸣笛闪灯 */  
    #define     OS_HISTORY_VEHICLE_INFO_REPORT      ( 1 )               /*0504历史信息上报 ENABLE-打开，DISABLE-关闭 关闭时只上报实时的车辆信息*/

#elif (OS_PROJECT_DEMAND_VERSION == OS_PROJECT_VERSION_CHITONG)

    #define     OS_SOFTWARE_VERSION   "01.006.0006.250523.1482.72.06"   /*系统软件版本号  中科微：1432  泰斗：1482*/ 
    #define     OS_FUNCTION_LOCK_CHECK_FUNCTION     ( 1 )               /*锁车检查车辆状态 ENABLE-打开，DISABLE-关闭*/
    #define     OS_LOCK_FAIL_FIND_FUNCTION          ( 1 )               /*锁车失败 鸣笛闪灯 */  
    #define     OS_HISTORY_VEHICLE_INFO_REPORT      ( 1 )               /*0504历史信息上报 ENABLE-打开，DISABLE-关闭 关闭时只上报实时的车辆信息*/

#elif (OS_PROJECT_DEMAND_VERSION == OS_PROJECT_VERSION_HELLO) 

    #define     OS_SOFTWARE_VERSION   "01.006.0036.250427.1482.72.08"   /*系统软件版本号*/
    #define     OS_HALUO_PROJECT_ENABLE             ( 1 )               /*哈罗项目使能开关 ENABLE-打开，DISABLE-关闭*/ 
    #define     OS_FUNCTION_LOCK_CHECK_FUNCTION     ( 0 )               /*锁车检查车辆状态 ENABLE-打开，DISABLE-关闭*/
    #define     OS_LOCK_FAIL_FIND_FUNCTION          ( 0 )               /*锁车失败 鸣笛闪灯 */  
    #define     OS_HISTORY_VEHICLE_INFO_REPORT      ( 0 )               /*0504历史信息上报 ENABLE-打开，DISABLE-关闭 关闭时只上报实时的车辆信息*/
    #define     OS_MCU_RELAY_LOCK_SYNC              ( 1 )               /* 锁车断电 开锁供电是否同步执行 1：同步   0：锁动作成功后执行继电器动作 */

#else
   
    #define     OS_SOFTWARE_VERSION   "01.006.0027.241112.1432.72.00"   /*系统软件版本号*/ 
    #define     OS_FUNCTION_LOCK_CHECK_FUNCTION     ( 1 )               /*锁车检查车辆状态 ENABLE-打开，DISABLE-关闭*/
    #define     OS_LOCK_FAIL_FIND_FUNCTION          ( 1 )               /*锁车失败  鸣笛闪灯 */  
    #define     OS_HISTORY_VEHICLE_INFO_REPORT      ( 1 )               /*0504历史信息上报 ENABLE-打开，DISABLE-关闭 关闭时只上报实时的车辆信息*/

    
#endif

/*****************************************************************************/
typedef   void *man_space_buf;
#define   MAN_SPACE_LEN ( 50 )

/* Type definitions. */
#define portCHAR        char
#define portFLOAT       float
#define portDOUBLE      double
#define portLONG        long
#define portSHORT       short
#define portSTACK_TYPE  uint32_t
#define portBASE_TYPE   long

typedef long BaseType_t;

#define pdFALSE			( ( BaseType_t ) 0 )
#define pdTRUE			( ( BaseType_t ) 1 )

#define pdPASS			( pdTRUE )
#define pdFAIL			( pdFALSE )

/********************************系统信号互斥体********************************/
typedef uint32_t GaozMutexHandle_t;  /*系统互斥体定义*/
/** ****************************************************************************
* @remarks       uint32_t gaoz_mutex_create( void )
* @brief         创建系统互斥体
* @param[in]     无
* @param[out]    无
* @return        >0 表示成功，=0 表示失败
* @attention     无
*******************************************************************************/
extern uint32_t gaoz_mutex_create( void );

/** ****************************************************************************
* @remarks       void gaoz_mutex_lock( uint32_t id )
* @brief         互斥体上锁
* @param[in]     id 创建的互斥体ID号
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void gaoz_mutex_lock( uint32_t id );

/** ****************************************************************************
* @remarks       int32_t gaoz_mutex_try_lock(uint32_t id,uint32_t delay)
* @brief         互斥体上锁，带延时等待功能
* @param[in]     id 创建的互斥体ID号;
* @param[in]     delay 延时等待的时候 单位MS;
* @param[out]    无
* @return        =0 成功 ，<0 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_mutex_try_lock(uint32_t id,uint32_t delay);

/** ****************************************************************************
* @remarks       void gaoz_mutex_unlock(uint32_t id)
* @brief         互斥体解锁
* @param[in]     id 创建的互斥体ID号
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void gaoz_mutex_unlock(uint32_t id);

/** ****************************************************************************
* @remarks       void gaoz_mutex_delete(uint32_t id)
* @brief         删除创建的互斥体
* @param[in]     id 创建的互斥体ID号
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void gaoz_mutex_delete(uint32_t id);

/****************************系统消息队列**************************************/
typedef uint32_t GaozQueueHandle_t;  /*系统消息队列定义*/

/** ****************************************************************************
* @remarks       uint32_t gaoz_queue_create(uint32_t count,uint32_t size)
* @brief         创建消息队列
* @param[in]     count 队列中可存储的 Item 最大个数;
* @param[in]     size 队列中单个Item 大小;
* @param[out]    无
* @return        ＞0 - 成功，表示队列 ID, 0 - 失败
* @attention     无
*******************************************************************************/
extern uint32_t gaoz_queue_create(uint32_t count,uint32_t size);

/** ****************************************************************************
* @remarks       int32_t gaoz_queue_put(uint32_t id,const void *msg,uint32_t time_out) 
* @brief         发送消息队列
* @param[in]     id 队列ID；
* @param[in]     *msg 放入队列中数据指针。数据大小必须与Item 大小一致；
* @param[in]     time_out 等待超时时间。当设置为 0 时，表示一直等待
* @param[out]    无
* @return        ＞0 - 成功 , 0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_queue_put(uint32_t id,const void *msg,uint32_t time_out);

/** ****************************************************************************
* @remarks       int32_t gaoz_queue_put(uint32_t id,const void *msg,uint32_t time_out) 
* @brief         接收消息队列
* @param[in]     id 队列ID ；
* @param[in]     time_out 等待超时时间。当设置为 0 时，表示一直等待；
* @param[out]    *msg 从队列中取出数据存入空间。 大小与Item 大小一致；
* @return        ＞0 - 成功 , 0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_queue_get(uint32_t id,void *msg,uint32_t time_out);

/** ****************************************************************************
* @remarks       gaoz_queue_put_isr(uint32_t id,const void *msg)
* @brief         发送消息队列，中断函数中使用
* @param[in]     id 队列ID；
* @param[in]     *msg 放入队列中数据指针。数据大小必须与Item 大小一致；
* @param[out]    无
* @return        ＞0 - 成功 , 0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_queue_put_isr(uint32_t id,const void *msg);

/** ****************************************************************************
* @remarks       int32_t gaoz_queue_get_isr(uint32_t id,void *msg)
* @brief         接收消息队列
* @param[in]     id 队列ID ；
* @param[out]    *msg 从队列中取出数据存入空间。 大小与Item 大小一致；
* @return        ＞0 - 成功 , 0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_queue_get_isr(uint32_t id,void *msg);

/** ****************************************************************************
* @remarks       void gaoz_queue_delete(uint32_t id)
* @brief         接收消息队列
* @param[in]     id 队列ID ；
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void gaoz_queue_delete(uint32_t id);

/*****************************系统信号量***************************************/
typedef uint32_t GaozSemaphoreHandle_t;  /*系统信号量定义*/

/** ****************************************************************************
* @remarks       uint32_t gaoz_sem_new(uint8_t inivalue)
* @brief         申请一个信号量资源。Inivalue 必须设置为 0 或者 1，
* @param[in]     inivalue 信号量初始化值；
* @param[out]    无
* @return        ＞0 - 成功，表示信号量 ID , = 0 - 失败
* @attention     无
*******************************************************************************/
extern uint32_t gaoz_sem_new(uint8_t inivalue);

/** ****************************************************************************
* @remarks       void gaoz_sem_free(uint32_t semid)
* @brief         释放一个信号量资源。
* @param[in]     semid 信号量 ID；
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void gaoz_sem_free(uint32_t semid);

/** ****************************************************************************
* @remarks       void gaoz_sem_wait(uint32_t semid) 
* @brief         信号量减一操作，若变为 0，则产生线程调度。
* @param[in]     semid 信号量 ID；
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void gaoz_sem_wait(uint32_t semid);

/** ****************************************************************************
* @remarks       bool gaoz_sem_try_wait(uint32_t semid,uint32_t timeout) 
* @brief         功能与其上函数一致。增加了超时机制。
* @param[in]     semid 信号量 ID；
* @param[in]     timeout 超时时长，单位为 ms
* @param[out]    无
* @return        true – 成功获取信号量,false – 超时返回， 未获取到信号量
* @attention     无
*******************************************************************************/
extern bool gaoz_sem_try_wait(uint32_t semid,uint32_t timeout);

/** ****************************************************************************
* @remarks       void gaoz_sem_signal(uint32_t semid) 
* @brief         信号量加一操作。注意：信号量为一个 UINT8 的值，使用时需要保证其不会溢出。
* @param[in]     semid 信号量 ID；
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void gaoz_sem_signal(uint32_t semid);

/****************************系统动态分配内存***********************************/

/** ****************************************************************************
* @remarks       void *gaoz_fibo_malloc(uint32_t size) 
* @brief         动态申请系统内存
* @param[in]     size 申请的空间长度
* @param[out]    无
* @return        返回申请的内存地址
* @attention     无
*******************************************************************************/
extern void *gaoz_fibo_malloc(uint32_t size);

/** ****************************************************************************
* @remarks       int32_t gaoz_fibo_free(void *buffer) 
* @brief         释放系统内存
* @param[in]     *buffer 释放内存空间头地址
* @param[out]    无
* @return        = 0 - 成功 ， ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_fibo_free(void *buffer);

/***************************系统休眠接口***************************************/

/** ****************************************************************************
* @remarks       void gaoz_task_sleep(uint32_t msec)
* @brief         让当前线程睡眠一段时间，让出CPU 给其他线程使用，睡眠的时间精度为 10ms，
                 比如输入参数 75（ms）最终会以 70ms 为实际睡眠时长。
* @param[in]     msec 睡眠时间，单位为毫秒。
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void gaoz_task_sleep(uint32_t msec);

/*************************系统任务接口*****************************************/

/** ****************************************************************************
* @remarks       void gaoz_task_sleep(uint32_t msec)
* @brief         创建 task 函数接口。注意，当任务结束的时候，需要显示的调用 fibo_thread_delete
*                函数。 Kernel 会在合适的时间将任务的资源释放掉。
* @param[in]     *pvTaskCode 任务函数接口
* @param[in]     *pcName 任务名称
* @param[in]     usStackDepth 任务栈大小
* @param[in]     *pvParameters  任务函数输入参数
* @param[in]     uxPriority 任务优先级
* @param[out]    无
* @return        = 0 - 成功 , ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_thread_create(void *pvTaskCode, char *pcName, uint32_t usStackDepth, void *pvParameters, uint32_t uxPriority);

/** ****************************************************************************
* @remarks       void gaoz_task_sleep(uint32_t msec)
* @brief         创建 task 函数接口。注意，当任务结束的时候，需要显示的调用 fibo_thread_delete
*                函数。 Kernel 会在合适的时间将任务的资源释放掉。
* @param[in]     *pvTaskCode 任务函数接口
* @param[in]     *pcName 任务名称
* @param[in]     usStackDepth 任务栈大小
* @param[in]     *pvParameters  任务函数输入参数
* @param[in]     uxPriority 任务优先级
* @param[out]    *pThreadId 任务ID
* @return        = 0 - 成功 , ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_thread_create_ex(void *pvTaskCode, char *pcName, uint32_t usStackDepth, void *pvParameters, uint32_t uxPriority, uint32_t *pThreadId );

/** ****************************************************************************
* @remarks       void gaoz_thread_delete(void) 
* @brief         删除任务
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void gaoz_thread_delete(void);

/******************************系统时间接口************************************/

/** ****************************************************************************
* @remarks       int32_t gaoz_set_rtc(hal_rtc_time_t *time)
* @brief         设置 RTC 时间。
* @param[in]     *time 设置日期数据指针
* @param[out]    无
* @return        0 - 成功 , ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_set_rtc(hal_rtc_time_t *time);

/** ****************************************************************************
* @remarks       int32_t gaoz_get_rtc(hal_rtc_time_t *time)
* @brief         获取 RTC 时间。
* @param[in]     *time 获取日期数据指针
* @param[out]    无
* @return        0 - 成功 , ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_get_rtc(hal_rtc_time_t *time);

/****************************系统发送AT命令接口********************************/
/** ****************************************************************************
* @remarks       int32_t gaoz_at_send(const UINT8 *cmd, UINT16 len)
* @brief         向模块发送 AT 命令，长度不能超过 1024 个字符， 必须要等待命令返回后才能发送另一条命令。
* @param[in]     *cmd AT 命令串（包含回车 0x0d）
* @param[in]     len 字符串长度
* @param[out]    无
* @return        ≥0 - 表示成功发送的字节数 , ＜0 - 表示失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_at_send(const uint8_t *cmd, uint16_t len);

/****************************系统发送其他命令接口******************************/

/** ****************************************************************************
* @remarks       int32_t gaoz_get_sim_status(uint8_t *pucSimStatus)
* @brief         获取 sim 卡插拔状态
* @param[in]     无
* @param[out]    *pucSimStatus :指针类型，作为出参使用， 其指向内容为1 时代表已插卡， 0 代表未插卡
* @return        0 - 成功 , <0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_get_sim_status(uint8_t *pucSimStatus);

/** ****************************************************************************
* @remarks       int32_t gaoz_get_ccid(uint8_t *ccid) 
* @brief         获取 ccid 号
* @param[in]     无
* @param[out]    *ccid 不能为 NULL
* @return        =0 -表示成功,<0 - 表示失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_get_ccid(uint8_t *ccid);

/** ****************************************************************************
* @remarks       int32_t gaoz_get_imsi(uint8_t *imsi)
* @brief         获取 imsi 号
* @param[in]     无
* @param[out]    *imsi 不能为 NULL，带获取的 IMSI 号
* @return        =0 -表示成功,<0 - 表示失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_get_imsi(uint8_t *imsi);

/** ****************************************************************************
* @remarks       int32_t gaoz_get_imei( uint8_t *imei )
* @brief         获取 imei 号
* @param[in]     无
* @param[out]    *imei 不能为 NULL，带获取的 imei 号
* @return        =0 -表示成功,<0 - 表示失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_get_imei( uint8_t *imei );

/** ****************************************************************************
* @remarks       int32_t gaoz_get_csq(uint8_t* rssi, uint8_t* ber) 
* @brief         获取模组 CSQ 信号强度等信息
* @param[in]     无
* @param[out]    *rssi received signal strength indication
* @param[out]    *ber bit error rate
* @return       =0 -表示成功 , <0 - 表示失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_get_csq(INT32* rssi, INT32* ber);
//#define gaoz_get_csq(rssi,ber) fibo_get_csq(rssi,ber)

/** ****************************************************************************
* @remarks       int32_t gaoz_get_reg_info(reg_info_t *reg_info,CFW_SIM_ID nSimID) 
* @brief         获取模块注册信息:当前注册的是 GSM 还是LTE， 注册状态STAT、TAC、CellID， LAC 参数
* @param[in]     nSimID 
* @param[out]    *reg_info
* @return        = 0 - 说明 reg_info 里面是有效数据 ,＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_get_reg_info(reg_info_t *reg_info,CFW_SIM_ID nSimID);

/***********************************系统PDP接口*********************************/

/** ****************************************************************************
* @remarks       int32_t gaoz_set_pdp_active(uint8_t active, uint8_t *apn, uint8_t *username, uint8_t *password, uint8_t nAuthProt, CFW_SIM_ID nSimID, uint8_t *ip)
* @brief         激活 PDP 连接
* @param[in]     active PDP 激活，只能取值 1；
* @param[in]     *apn init attach apn,可以为空；
* @param[in]     *username 用户名（没有为空）
* @param[in]     *password 密码（没有为空）
* @param[in]     nAuthProt 0：apn 鉴权参数无效 1：PAP 2：CHAP
* @param[in]     nSimID sim 卡subid，取值 0 和 1，单卡用户默认为 0;双卡用户取 data 业务所在 SIM卡的 subid；
* @param[out]    *ip 输出 IP 地址字符串 可以是 IPV4 only 或IPV6 only 或IPV4V6 双栈地址字符串；
* @return        返回 0 且 IP 不为 0 表示成功，否则失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_set_pdp_active(uint8_t active, uint8_t *apn, uint8_t *username, uint8_t *password, uint8_t nAuthProt, CFW_SIM_ID nSimID, uint8_t *ip);
//#define gaoz_set_pdp_active(active,apn,username,password,nAuthProt,nSimID,ip) fibo_PDPActive(active,apn,username,password,nAuthProt,nSimID,ip)

/** ****************************************************************************
* @remarks       int32_t gaoz_set_pdp_release(uint8_t deactive, CFW_SIM_ID nSimID) 
* @brief         断开 fibo_PDPActive 接口建立的那路 PDP 连接,即默认断开 CID1 路
* @param[in]     deactive 去激活PDP ，只能取值 0;
* @param[in]     nSimID 取值 0 和 1，单卡用户默认为 0;双卡用户取 data 业务所在 SIM 卡的 subid；
* @param[out]    无
* @return        0 - 成功 ,＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_set_pdp_release(uint8_t deactive, CFW_SIM_ID nSimID);

/** ****************************************************************************
* @remarks       int32_t gaoz_set_pdp_status(char cid, uint8_t *ip, uint8_t *cid_status,CFW_SIM_ID nSimID)
* @brief         支持多路 PDP 连接；获取指定已激活那路的PDP address
* @param[in]     cid 指定已激活的PDP profile ID；
* @param[in]     nSimID  sim 卡subid，取值 0 和 1，单卡用户默认为 0;
* @param[out]    *ip 输出已激活 CID 的IP 地址；
* @return        *cid_status 输出当前CID 激活状态， 0 表示未激活， 1 表示激活
* @attention     无
*******************************************************************************/
extern int32_t gaoz_set_pdp_status(char cid, uint8_t *ip, uint8_t *cid_status,CFW_SIM_ID nSimID);

/***************************系统栈空间尺寸查询接口*****************************/

/** ****************************************************************************
* @remarks       int32_t gaoz_get_heapinfo(uint32_t * size,uint32_t * avail_size,uint32_t * max_block_size) 
* @brief         获取系统栈空间尺寸 单位是字节调用要包含 osi_mem.h
* @param[in]     无
* @param[out]    * size 系统总内存尺寸
* @param[out]    * avail_size 当前可用内存大小（实际值有可能会小于该值）
* @param[out]    * max_block_size  实际可分配最大块大小
* @return        ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_get_heapinfo(uint32_t * size,uint32_t * avail_size,uint32_t * max_block_size);

/******************************系统tick接口***********************************/
#define	GAOZ_TICK_PERIOD_S ( 1 )//16384 ) /*系统周期时间*/

/** ****************************************************************************
* @remarks       int32_t gaoz_sock_close( uint32_t sock )
* @brief         关闭网络socket id 
* @param[in]     sock 创建的sock id
* @param[out]    无
* @return        = 0 成功  ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_sock_close( int32_t sock );

/** ****************************************************************************
* @remarks       int32_t gaoz_sock_connect( int32_t sock, GAPP_TCPIP_ADDR_T *addr )
* @brief         与远端 socket 建立链接。
* @param[in]     sock 创建的sock id  
* @param[out]    *addr 网络字节序的地址信息
* @return        = 0 成功  ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_sock_connect( int32_t sock, GAPP_TCPIP_ADDR_T *addr );

/** ****************************************************************************
* @remarks       int32_t gaoz_sock_listen( int32_t sock )
* @brief         TCP 侦听
* @param[in]     sock 创建的sock id  
* @param[out]    无
* @return        = 0 成功  ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_sock_listen( int32_t sock );

/** ****************************************************************************
* @remarks       int32_t gaoz_sock_bind( int32_t sock, GAPP_TCPIP_ADDR_T *addr )
* @brief         绑定本地端口。
* @param[in]     sock 创建的sock id  
* @param[out]    *addr 网络字节序地址， IP 为 0
* @return        = 0 成功  ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_sock_bind( int32_t sock, GAPP_TCPIP_ADDR_T *addr );

/** ****************************************************************************
* @remarks       int32_t gaoz_sock_accept( int32_t sock, GAPP_TCPIP_ADDR_T *addr )
* @brief         接受远端的连接请求，成功返回一个新的 socketID
* @param[in]     sock 创建的sock id  
* @param[out]    *addr 获得远端地址信息
* @return        ≥0 - 成功,该值为一个已经与远端 socket建立了链接的 socketID  ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_sock_accept( int32_t sock, GAPP_TCPIP_ADDR_T *addr );

/** ****************************************************************************
* @remarks       int32_t gaoz_sock_send( int32_t sock, uint8_t *buff, uint16_t len)
* @brief         TCP 发送数据，一次最大发送 1024 字节数据。
* @param[in]     sock 创建的sock id  
* @param[in]     *buff 数据首地址
* @param[in]     len 数据长度 
* @param[out]    无
* @return        ≥0 - 成功,该值为一个已经与远端 socket建立了链接的 socketID  ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_sock_send( int32_t sock, uint8_t *buff, uint16_t len);

/** ****************************************************************************
* @remarks       int32_t gaoz_sock_send( int32_t sock, uint8_t *buff, uint16_t len)
* @brief         发送数据到指定的地址，一次最大发送 1024 字节数据。
* @param[in]     sock 创建的sock id  
* @param[in]     *buff 数据首地址
* @param[in]     len 数据长度 
* @param[in]     *dest 远端地址信息
* @param[out]    无
* @return        ≥0 - 返回实际发送的数据  ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_sock_send2( int32_t sock, uint8_t *buff, uint16_t len, GAPP_TCPIP_ADDR_T *dest);

/** ****************************************************************************
* @remarks       int32_t gaoz_sock_recv( int32_t sock, uint8_t *buff, uint16_t len )
* @brief         接收 TCP 数据函数，一次读取最长不超过 2048 字节。
* @param[in]     sock 创建的sock id  
* @param[in]     len 接收数据 buff 首地址 
* @param[out]    *buff 数据首地址
* @return        ≥0 - 实际接收到的数据长度(对端正常断开为 0) ＜0 - socket 错误（网络异常断开-1）
* @attention     无
*******************************************************************************/
extern int32_t gaoz_sock_recv( int32_t sock, uint8_t *buff, uint16_t len );

/** ****************************************************************************
* @remarks       int32_t gaoz_sock_recv_from( int32_t sock, uint8_t *buff, uint16_t len, GAPP_TCPIP_ADDR_T *src)
* @brief         接收数据函数，并返回发送者信息，一次读取最长不要超过 2048 字节。
* @param[in]     sock 创建的sock id  
* @param[in]    *buff 数据首地址
* @param[in]     len 接收数据 buff 首地址 
* @param[out]    *src 回传的远端地址信息
* @return        ≥0 - 实际接收到的数据长度(对端正常断开为 0) ＜0 - socket 错误（网络异常断开-1）
* @attention     无
*******************************************************************************/
extern int32_t gaoz_sock_recv_from( int32_t sock, uint8_t *buff, uint16_t len, GAPP_TCPIP_ADDR_T *src);

/** ****************************************************************************
* @remarks       int32_t gaoz_get_host_name( char *hostname, ip_addr_t *addr, uint8_t nCid, CFW_SIM_ID nSimID )
* @brief         在网络上获取相应域名对应的 IP，域名长度不能超过 100 字节。
* @param[in]     *hostname 主机域名字符串比如 www.baidu.com；  
* @param[out]     *addr 输出 IP 地址输出 IPV4:
* @param[in]     len 接收数据 buff 首地址 
* @param[out]    *src 回传的远端地址信息
* @return        ≥0 - 实际接收到的数据长度(对端正常断开为 0) ＜0 - socket 错误（网络异常断开-1）
* @attention     无
*******************************************************************************/
extern int32_t gaoz_get_host_name( char *hostname, ip_addr_t *addr, uint8_t nCid, CFW_SIM_ID nSimID );

/** ****************************************************************************
* @remarks       int32_t gaoz_sock_set_opt( int32_t sock, int32_t level, int32_t optname, const void *optval, int32_t optlen)
* @brief         设置 socket 选项参数目前只支持SO_KEEPALIVE不支持 SO_SNDTIMEO、不支持 SO_RCVTIMEO
* @param[in]     sock Socket id  
* @param[in]     level 协议层级(固定为0xfff)
* @param[in]     optname 设置选项类型
* @param[in]     *optval 选项值指针
* @param[in]     optlen 选项值长度
* @return        0 - 成功  ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_sock_set_opt( int32_t sock, int32_t level, int32_t optname, const void *optval, int32_t optlen);

/** ****************************************************************************
* @remarks       int32_t gaoz_sock_get_opt( int32_t sock, int32_t level, int32_t optname, const void *optval, int32_t optlen)
* @brief         设置 socket 选项参数目前只支持SO_KEEPALIVE不支持 SO_SNDTIMEO、不支持 SO_RCVTIMEO
* @param[in]     sock Socket id  
* @param[in]     level 协议层级(固定为0xfff)
* @param[in]     optname 设置选项类型
* @param[out]     *optval 选项值指针
* @paramout]     *optlen 选项值长度指针
* @return        0 - 成功  ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_sock_get_opt( int32_t sock, int32_t level, int32_t optname, void *optval, INT32 *optlen );

/** ****************************************************************************
* @remarks       int32_t  gaoz_sock_lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout)
* @brief         Lwip select 接口用于同一线程内多sockets 业务 并行收发管理。
* @param[in]     maxfdp1 管理当前创建的 socket 个数， 等于sockid +1;
* @param[in]     *readset 检测接收数据的 参数
* @param[in]     *writeset 检测发出数据的参数
* @param[in]     *exceptset 记录sockets 创建后 TCP 握手 收发数据遇到的error
* @param[in]     *timeout 设置 select阻塞时间， 给予底层充足的时间检测设置 fd_set,一般设置 1—5 秒
* @param[out]    无
* @return        0 - 成功  ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_sock_lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);

/** ****************************************************************************
* @remarks       int32_t gaoz_cfun_one( void )
* @brief         设置模块进入全功能模式
* @param[in]     无
* @param[out]    无
* @return        0 成功 , <0 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_cfun_one( void );

/** ****************************************************************************
* @remarks       int32_t gaoz_cfun_zero( void )
* @brief         设置模块进入最小功能模式
* @param[in]     无
* @param[out]    无
* @return        0 成功 , <0 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_cfun_zero( void );

/** ****************************************************************************
* @remarks       uint32_t gaoz_get_systick(void) 
* @brief         获取系统启动至今所累计的TICK，系统 TICK 的时钟频率为16384Hz。
* @param[in]     无
* @param[out]    无
* @return        系统 TICK
* @attention     无
*******************************************************************************/
extern uint32_t gaoz_get_systick(void);

/** ****************************************************************************
* @remarks       uint32_t gaoz_get_thread_id(void) 
* @brief         获取系统的任务ID
* @param[in]     无
* @param[out]    无
* @return        任务ID
* @attention     无
*******************************************************************************/
extern uint32_t gaoz_get_thread_id(void);

/******************************系统看门狗接口接口******************************/

/** ****************************************************************************
* @remarks       int32_t gaoz_watchdog_enable(uint32_t sec)
* @brief         设置并启动看门狗，当设置的时间到达前没有喂狗，系统重启。设置的等待时间范围是 1 秒至1000 秒。
* @param[in]     sec 看门狗时间，单位秒，可设置范围：1 - 1000
* @param[out]    无
* @return        0 - 成功 ， ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_watchdog_enable(uint32_t sec);

/** ****************************************************************************
* @remarks       int32_t gaoz_watchdog_feed(void) 
* @brief         喂狗操作
* @param[in]     无
* @param[out]    无
* @return        0 - 成功 ， ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_watchdog_feed(void);

/** ****************************************************************************
* @remarks       int32_t gaoz_watchdog_disable(void) 
* @brief         关闭系统看门狗
* @param[in]     无
* @param[out]    无
* @return        0 - 成功 ， ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_watchdog_disable(void);

/******************************系统网络接口************************************/

/** ****************************************************************************
* @remarks       int32_t gaoz_sock_send(int32_t sock, uint8_t *buff, uint16_t len) 
* @brief         TCP 发送数据，一次最大发送 1024 字节数据。
* @param[in]     sock Socket id
* @param[in]     *buff 数据首地址
* @param[in]     len 数据长度
* @param[out]    无
* @return        ≥0 - 返回实际发送的数据 ， ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_sock_send(int32_t sock, uint8_t *buff, uint16_t len);

/*系统IO控制接口*/
/** ****************************************************************************
* @remarks       int32_t gaoz_gpio_cfg(SAPP_IO_ID_T id,SAPP_GPIO_CFG_T cfg)  
* @brief         设置对应 PIN 脚的输入输出方向。（仅对当前 PIN 脚做 GPIO 模式时有效）
* @param[in]     id 脚序列号
* @param[in]     cfg 设置输入输出方向；0 为输入， 1 为输出
* @param[out]    无
* @return        1 - 表示成功 , -1- 表示失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_gpio_cfg(SAPP_IO_ID_T id,SAPP_GPIO_CFG_T cfg);

/** ****************************************************************************
* @remarks       int32_t gaoz_gpio_get(SAPP_IO_ID_T id,UINT8 * level)
* @brief         获取当前 PIN 脚高低电平（仅对当前 PIN 脚做 GPIO模式，且是 output 时有
* @param[in]     id 脚序列号
* @param[out]    *level 用来获取当前PIN 脚高低电平的入参
* @return        1 - 表示成功 , -1- 表示失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_gpio_get(SAPP_IO_ID_T id,UINT8 *level);

/** ****************************************************************************
* @remarks       int32_t gaoz_gpio_mode_set(SAPP_IO_ID_T id,UINT8 mode) 
* @brief         设置 PIN 脚的复用模式
* @param[in]     id 脚序列号
* @param[in]     mode 要复用的 PIN 脚对用的功能 mode
* @param[out]    无
* @return        1 - 表示成功 , -1- 表示失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_gpio_mode_set(SAPP_IO_ID_T id,uint8_t mode);

/** ****************************************************************************
* @remarks       int32_t gaoz_gpio_pull_disable(SAPP_IO_ID_T id)
* @brief         将该 PIN 脚恢复到默认的模式
* @param[in]     id 脚序列号
* @param[out]    无
* @return        1 - 表示成功 , -1- 表示失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_gpio_pull_disable(SAPP_IO_ID_T id);

/** ****************************************************************************
* @remarks       int32_t gaoz_gpio_set(SAPP_IO_ID_T id,uint8_t level)
* @brief         设置当前 PIN 脚高低电平（仅对当前 PIN 脚做 GPIO模式，且是 output 时有效）
* @param[in]     id 脚序列号
* @param[in]     level用来设置当前 PIN脚高低电平
* @param[out]    无
* @return        1 - 表示成功 , -1- 表示失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_gpio_set(SAPP_IO_ID_T id,uint8_t level);

/** ****************************************************************************
* @remarks       int32_t gaoz_gpio_isr_deinit(SAPP_IO_ID_T id) 
* @brief         将该 PIN 脚恢复到默认的模式，如果默认就是 GPIO模式，将其设置为 GPIO 的output 模式，默认拉高
* @param[in]     id 脚序列号
* @param[out]    无
* @return        1 - 表示成功 , -1- 表示失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_gpio_isr_deinit(SAPP_IO_ID_T id);

/** ****************************************************************************
* @remarks       int32_t gaoz_gpio_isr_init(SAPP_IO_ID_T id,oc_isr_t * isr_cfg)
* @brief         将该 PIN 脚恢复到默认的模式，如果默认就是 GPIO模式，将其设置为 GPIO 的output 模式，默认拉高
* @param[in]     id 脚序列号
* @param[in]     *isr_cfg 中断的配置信息
* @param[out]    无
* @return        1 - 表示成功 , -1- 表示失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_gpio_isr_init(SAPP_IO_ID_T id,oc_isr_t *isr_cfg);

/** ****************************************************************************
* @remarks       int32_t gaoz_gpio_pull_up_or_down(SAPP_IO_ID_T id,bool is_pull_up)
* @brief         将该 PIN 设置上拉或下拉
* @param[in]     id 脚序列号
* @param[in]     is_pull_up 
* @param[out]    无
* @return        1 - 表示成功 , -1- 表示失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_gpio_pull_up_or_down(SAPP_IO_ID_T id,bool is_pull_up);

/** ****************************************************************************
* @remarks       int32_t gaoz_lpg_switch(uint8_t ucLpgSwitch) 
* @brief         LPG 灯开关控制功能
* @param[in]     ucLpgSwitch LPG 灯控制开关， 0 为关闭， 1 为开启，并且掉电保存
* @param[out]    无
* @return        1 - 表示成功 , -1- 表示失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_lpg_switch(uint8_t ucLpgSwitch);

/*************************系统设置休眠*****************************************/

/** ****************************************************************************
* @remarks       int32_t gaoz_set_sleep_mode(uint8_t time) 
* @brief         开启休眠功能
* @param[in]     time 设置几秒后进入休眠，为 0 时关闭休眠
* @param[out]    无
* @return        0 - 成功，＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_set_sleep_mode(uint8_t time);

/*系统复位*/
/** ****************************************************************************
* @remarks       int32_t gaoz_soft_reset(void) 
* @brief         系统重启
* @param[in]     无
* @param[out]    无
* @return        = 0 - 成功 , ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_soft_reset(void);

/** ****************************************************************************
* @remarks       int32_t gaoz_soft_power_off(void)
* @brief         系统关机
* @param[in]     无
* @param[out]    无
* @return        = 0 - 成功 , ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_soft_power_off(void);

/*******************************系统定时器*************************************/

/** ****************************************************************************
* @remarks       uint32_t gaoz_timer_new(uint32_t ms, void (*fn)(void *arg), void *arg) 
* @brief         创建并启动定时器，时间和函数都不能是 0（NULL）
* @param[in]     ms 定时时间（单位：毫秒
* @param[in]     *fn  回调函数
* @param[in]     *arg 回调函数参数
* @param[out]    无
* @return        ＞0 - 成功，表示定时器 ID , =0 - 失败
* @attention     无
*******************************************************************************/
extern uint32_t gaoz_timer_new(uint32_t ms, void (*fn)(void *arg), void *arg);

/** ****************************************************************************
* @remarks       uint32_t gaoz_timer_period_new(uint32_t ms, void (*fn)(void *arg), void *arg)
* @brief         创建并启动循环定时器，时间和函数都不能是 0（NULL）注：循环定时器如果未显示删除(fibo_timer_free)， 则会一直运行下去
* @param[in]     ms 定时时间（单位：毫秒
* @param[in]     *fn  回调函数
* @param[in]     *arg 回调函数参数
* @param[out]    无
* @return        ＞0 - 成功，表示定时器 ID , =0 - 失败
* @attention     无
*******************************************************************************/
extern uint32_t gaoz_timer_period_new(uint32_t ms, void (*fn)(void *arg), void *arg);

/** ****************************************************************************
* @remarks       uint32_t gaoz_set_rtc_irq_period(UINT32 ms, void (*fn)(void *arg), void *arg )
* @brief         创建并启动循环定时器，时间和函数都不能是 0（NULL）注：循环定时器如果未显示删除(fibo_timer_free)， 则会一直运行下去
* @param[in]     ms 定时时间（单位：毫秒
* @param[in]     *fn  回调函数
* @param[in]     *arg 回调函数参数
* @param[out]    无
* @return        ＞0 - 成功，表示定时器 ID , =0 - 失败
* @attention     无
*******************************************************************************/
extern uint32_t gaoz_set_rtc_irq_period(uint32_t ms, void (*fn)(void *arg), void *arg );

/** ****************************************************************************
* @remarks       int32_t gaoz_timer_free(uint32_t timerid)
* @brief         停止并释放定时器或循环定时器。
* @param[in]     无
* @param[out]    无
* @return        0 - 成功 , ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_timer_free(uint32_t timerid);

/*************************************UART*************************************/

/** ****************************************************************************
* @remarks       int32_t gaoz_hal_uart_init(hal_uart_port_t uart_port, hal_uart_config_t *uart_config, uart_input_callback_t recv_cb, void *arg)
* @brief         UART Open 接口。 UART口接收到的数据，通过回调函数通知 DEMO
* @param[in]     uart_port 串口号
* @param[in]     *uart_config 配置信息
* @param[in]     recv_cb 回调函数
* @param[in]     *arg 
* @param[out]    无
* @return        0 - 成功 , ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_hal_uart_init(hal_uart_port_t uart_port, hal_uart_config_t *uart_config, uart_input_callback_t recv_cb, void *arg);

/** ****************************************************************************
* @remarks       int32_t gaoz_hal_uart_init(hal_uart_port_t uart_port, hal_uart_config_t *uart_config, uart_input_callback_t recv_cb, void *arg)
* @brief         UART Open 接口。 UART口接收到的数据，通过回调函数通知 DEMO
* @param[in]     uart_port 串口号
* @param[in]     *buff 发送数据的源地址
* @param[in]     len 发送数据的长度
* @param[out]    无
* @return        0 - 成功 , ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_hal_uart_put(hal_uart_port_t uart_port, uint8_t *buff, uint32_t len);

/** ****************************************************************************
* @remarks       int32_t gaoz_hal_uart_data_to_send(int uart_port)
* @brief         无
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern int32_t gaoz_hal_uart_data_to_send(int uart_port);

/** ****************************************************************************
* @remarks       int32_t gaoz_hal_uart_deinit(uart_port) 
* @brief         UART Close 接
* @param[in]     uart_port 串口号
* @param[out]    无
* @return        0 - 表示成功 , ＜0 - 表示失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_hal_uart_deinit(hal_uart_port_t uart_port);

/** ****************************************************************************
* @remarks       atDevice_t * gaoz_usb_device_init(uint32_t name, usb_input_callback_t recv_cb)
* @brief         USB 驱动初始化
* @param[in]     name USB 驱动号
* @param[in]     recv_cb 数据接收回调函数
* @param[out]    无
* @return        NULL - 表示失败
* @attention     无
*******************************************************************************/
extern atDevice_t * gaoz_usb_device_init(uint32_t name, usb_input_callback_t recv_cb);

/** ****************************************************************************
* @remarks       int gaoz_usb_device_send(atDevice_t *th, const void *data, size_t length)
* @brief         USB 数据发送
* @param[in]     *th USB id
* @param[in]     *data 发送数据的源地址 
* @param[in]     length 发送数据的长度
* @param[out]    无
* @return        >=0 - 表示成功 , ＜0 - 表示失败
* @attention     无
*******************************************************************************/
extern int gaoz_usb_device_send(atDevice_t *th, const void *data, size_t length);

/** ****************************************************************************
* @remarks       void gaoz_mem_space_init(void)
* @brief         系统动态分配空间内存回收站 初始化
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void gaoz_mem_space_init(void);
/** ****************************************************************************
* @remarks       void * gaoz_malloc_mem(uint32_t len)
* @brief         动态分配内存空间
* @param[in]     len 申请分配空间尺寸
* @param[out]    无
* @return        分配到的空间地址
* @attention     无
*******************************************************************************/
extern void * gaoz_malloc_mem(uint32_t len);

/** ****************************************************************************
* @remarks       uint32_t gaoz_malloc_mem_size( void )
* @brief         释放内存分配的地址空间
* @param[in]     *pv 释放的空间头地址
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void  gaoz_free_mem( void *pv );

/** ****************************************************************************
* @remarks       uint32_t gaoz_malloc_mem_size( void )
* @brief         获取动态内存分配的数量
* @param[in]     无
* @param[out]    无
* @return        分配动态内存的数量 最大值 MAN_SPACE_LEN 
* @attention     无
*******************************************************************************/
extern uint32_t gaoz_malloc_mem_size( void );

/** ****************************************************************************
* @remarks       void gaoz_osi_log( const char *s )
* @brief         系统打印数据接口，封装底层接口
* @param[in]     *s 打印数据源地址
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void gaoz_osi_log( const char *s );

/** ****************************************************************************
* @remarks       int32_t gaoz_spi_open( drvSpiConfig_t cfg, SPIHANDLE * spiFd)
* @brief         打开SPI节点功能操作
* @param[in]     cfg SPI参数配置
* @param[out]    *spi_fd SPI节点输出
* @return        = 0 成功   < 0 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_spi_open( drvSpiConfig_t cfg, SPIHANDLE *spi_fd);

/** ****************************************************************************
* @remarks       int32_t gaoz_spi_close( SPIHANDLE *spi_fd )
* @brief         关闭SPI节点操作
* @param[in]     *spi_fd SPI节点
* @param[out]    无
* @return        = 0 成功   < 0 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_spi_close( SPIHANDLE *spi_fd );

/** ****************************************************************************
* @remarks       int32_t gaoz_spi_send( SPIHANDLE spi_fd, SPI_IOC spi_ioc, void * send_addr, uint32_t size )
* @brief         SPI 发送数据
* @param[in]     *spi_fd SPI节点
* @param[in]     spi_ioc SPI配置参数
* @param[in]     *send_addr 数据源地址
* @param[in]     size 数据长度
* @param[out]    无
* @return        = 0 成功   < 0 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_spi_send( SPIHANDLE spi_fd, SPI_IOC spi_ioc, void *send_addr, uint32_t size );

/** ****************************************************************************
* @remarks       int32_t gaoz_spi_recv( SPIHANDLE spi_fd, SPI_IOC spi_ioc, void * send_addr, void * read_addr, uint32_t size )
* @brief         SPI 读取数据
* @param[in]     *spi_fd SPI节点
* @param[in]     spi_ioc SPI配置参数
* @param[in]     *send_addr 数据源地址
* @param[in]     *read_addr 读取数据源地址
* @param[in]     size 数据长度
* @param[out]    无
* @return        = 0 成功   < 0 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_spi_recv( SPIHANDLE spi_fd, SPI_IOC spi_ioc, void * send_addr, void * read_addr, uint32_t size );

/** ****************************************************************************
* @remarks       int32_t gaoz_spi_pinctrl( SPIHANDLE spi_fd, drvSpiPinCtrl pin_ctrl, drvSpiPinState pin_state )
* @brief         SPI 引脚控制
* @param[in]     *spi_fd SPI节点
* @param[in]     pin_ctrl 引脚控制
* @param[in]     pin_state 引脚状态
* @param[out]    无
* @return        = 0 成功   < 0 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_spi_pinctrl( SPIHANDLE spi_fd, drvSpiPinCtrl pin_ctrl, drvSpiPinState pin_state );

/** ****************************************************************************
* @remarks       int32_t gaoz_file_open( const char * pathname,uint32_t opt )
* @brief         打开文件
* @param[in]     *pathname 文件名称
* @param[in]     opt 打开方式配置
* @param[out]    无
* @return        >=0 成功,打开文件的句柄   ，< 0 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_file_open( const char *pathname,uint32_t opt );

/** ****************************************************************************
* @remarks       int32_t gaoz_file_close( int32_t fd )
* @brief         打开文件
* @param[in]     fd 文件句柄
* @param[out]    无
* @return        =0 成功 ，< 0 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_file_close( int32_t fd );

/** ****************************************************************************
* @remarks       int32_t gaoz_file_read( int32_t fd, uint8_t *buff, uint32_t size )
* @brief         打开文件
* @param[in]     fd 读取文件句柄
* @param[in]     size 数据的长度
* @param[out]    *buff 读取文件数据的地址
* @return        >=0 成功，读出数的长度 ，< 0 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_file_read( int32_t fd, uint8_t *buff, uint32_t size );

/** ****************************************************************************
* @remarks       int32_t gaoz_file_write( int32_t fd,uint8_t *buff,uint32_t size )
* @brief         打开文件
* @param[in]     fd 写文件句柄
* @param[in]     *buff 写文件数据的地址
* @param[in]     size 数据的长度
* @param[out]    无
* @return        =0 成功，写入字节的数 ，< 0 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_file_write( int32_t fd,uint8_t *buff,uint32_t size );

/** ****************************************************************************
* @remarks       int32_t gaoz_file_seek( int32_t fd, int32_t offset, uint8_t opt )
* @brief         移动文件数据指针
* @param[in]     fd 文件句柄
* @param[in]     offset 从文件开始的偏移
* @param[in]     opt 偏移的起始位置
* @param[out]    无
* @return        =0 返回操作成功后文件指针位置 ，< 0 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_file_seek( int32_t fd, int32_t offset, uint8_t opt );

/** ****************************************************************************
* @remarks       int32_t gaoz_ble_add_service_and_characteristic(const gatt_element_t *gatt_element, uint32_t size)
* @brief         创建GATT service 及 characteristic
* @param[in]     *gatt_element  配合参数列表
* @param[in]     size gatt_element 数组元素gatt_element_t的个数
* @param[out]    无
* @return        ≥0 - 成功   ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_ble_add_service_and_characteristic(const gatt_element_t *gatt_element, uint32_t size);

/** ****************************************************************************
* @remarks       int32_t gaoz_bt_onoff( uint8_t onoff )
* @brief         打开或关闭蓝牙
* @param[in]     onoff  取值范围 0 关闭蓝牙  1 打开蓝牙
* @param[out]    无
* @return        ≥0 - 成功   ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_bt_onoff( uint8_t onoff );

/** ****************************************************************************
* @remarks       int32_t gaoz_ble_enable_dev( int onoff )
* @brief         BLE 广播打开和关闭，用于ble 作为 服务端时
* @param[in]     onoff  取值范围 0 关闭广播  1 打开广播
* @param[out]    无
* @return        ≥0 - 成功   ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_ble_enable_dev( int onoff );

/** ****************************************************************************
* @remarks       int32_t gaoz_ble_set_read_name( uint8_t set_read,uint8_t *name,uint8_t name_type )
* @brief         修改读取BLE名称
* @param[in]     set_read  0表示设置。1表示读取。
* @param[in out] *name 名称字符串，外部定义名称最大字符串要小于等于29；
* @param[in]     name_type 只支持0，ASCII码
* @return        ≥0 - 成功   ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_ble_set_read_name( uint8_t set_read,uint8_t *name,uint8_t name_type );

/** ****************************************************************************
* @remarks       int32_t gaoz_ble_notify(gatt_le_data_info_t *data,int type)
* @brief         用于发送GATT NOTIFY数据，用于ble 作为 服务端时
* @param[in]     *data
* @param[in]     type 
* @return        ≥0 - 成功   ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_ble_notify(gatt_le_data_info_t *data,int type);

/** ****************************************************************************
* @remarks       int32_t gaoz_ble_set_read_addr( uint8_t set_read,uint8_t addr_type,char *addr )
* @brief         设置读取PUBLIC 或者 RANDOM 地址
* @param[in]     set_read  0表示设置。1表示读取。
* @param[in]     addr_type  0表示PUBLIC。 1表示RANDOM。
* @param[in]     *addr  源地址，外部长度需大于18，比如：”A6:35:F2:C0:05:B2”
* @param[out]    *addr  目标地址，外部长度需大于18，比如：”A6:35:F2:C0:05:B2”
* @return        ≥0 - 成功   ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_ble_set_read_addr( uint8_t set_read,uint8_t addr_type,char *addr );

/** ****************************************************************************
* @remarks       int32_t gaoz_ble_set_dev_data( int data_len,char *data )
* @brief         设置广播数据
* @param[in]     data_len  0表示设置。1表示读取。
* @param[in]     *data  数据 目标地址
* @return        ≥0 - 成功 ＜0 - 失败
* @attention     注意：设置广播数据时，需要先去失能广播，待广播数据设置完成后再使能广播。
*******************************************************************************/
extern int32_t gaoz_ble_set_dev_data( int data_len,char *data );

/** ****************************************************************************
* @remarks       int32_t fibo_hal_adc_init(void)
* @brief         初始化ADC接口
* @param[in]     无
* @param[in]     无
* @return        =0 - 成功   ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_hal_adc_init( void );

/** ****************************************************************************
* @remarks       int32_t fibo_hal_adc_deinit( void )
* @brief         关闭ADC接口
* @param[in]     无
* @param[in]     无
* @return        =0 - 成功   ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_hal_adc_deinit( void );

/** ****************************************************************************
* @remarks       int32_t gaoz_hal_adc_get_data_polling( hal_adc_channel_t channel, UINT32 *data )
* @brief         获取ADC通道数据
* @param[in]     channel 选择的通道 L610支持1-3  LC610N 支持2-3  LG610支持1-4
* @param[out]     *data 返回的数据
* @return        =0 - 成功   ＜0 - 失败
* @attention     无
*******************************************************************************/
extern int32_t gaoz_hal_adc_get_data_polling( hal_adc_channel_t channel, uint32_t *data );


extern int32_t gaoz_i2c_open( HAL_I2C_BPS_T bps );

extern int32_t gaoz_i2c_close( void );

extern int32_t  gaoz_i2c_send_data( uint32_t slaveAddr,uint32_t memAddr,bool is16bit,uint8_t *pData,uint8_t datalen);

extern int32_t gaoz_i2c_get_data( uint32_t slaveAddr,uint32_t memAddr,bool is16bit,uint8_t *pData,uint8_t datalen);


#endif

